package arghhh.implementaçao;

import arghhh.implementaçao.modelo.Banda;
import arghhh.implementaçao.modelo.Fa;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Sistema {

    private Connection conexao = null;

    public Sistema(){
        System.out.println("-------------------- Criando a conexao com o banco...");
        this.conexao = Conexao.getInstance().getConnection();
        System.out.println("-------------------- Conexao criada.......");
    }

    public void inserirFa(String login, String senha, String nome, String email, String dia, String mes, String ano, String cidade, String estado, String[] genero, String[] estilos) throws SQLException{
        System.out.println("-------------------- Tah na funçao de inserçao...");
        
        String comando = "insert into usuario(login, senha, nome, email, data, cidade, estado) values(?,?,?,?,?,?,?)";
        PreparedStatement statement = conexao.prepareStatement(comando);

        statement.setString(1, login);
        statement.setString(2, senha);
        statement.setString(3, nome);
        statement.setString(4, email);
        int x = Integer.parseInt(ano);
        Date data = new Date(x , Integer.parseInt(mes), Integer.parseInt(dia));
        statement.setDate(5, data);
        statement.setString(6, cidade);
        statement.setString(7, estado);

        statement.execute();
        statement.close();

        comando = "insert into usuario_fa(login, genero) values(?,?)";
        PreparedStatement statement2 = conexao.prepareStatement(comando);

        statement2.setString(1, login);
        statement2.setString(2, genero[0]);

        statement2.execute();
        statement2.close();

        String comandoBusca = "SELECT codigo FROM usuario_fa WHERE login = ?";
        PreparedStatement stmt = conexao.prepareStatement(comandoBusca);

        stmt.setString(1, login);

        ResultSet result = stmt.executeQuery();
        int codigo = 0;
        while(result.next()){
            codigo = result.getInt("codigo");
        }

        comando = "insert into estilos(codigo, login, estilo) values(?,?,?)";

        for(int i = 0;i < estilos.length;i++){
            PreparedStatement statement3 = conexao.prepareStatement(comando);
            statement3.setInt(1, codigo);
            statement3.setString(2, login);
            statement3.setString(3, estilos[i]);
            statement3.execute();
            statement3.close();
        }
    }

    public void inserirBanda(String login, String senha, String nome, String email, String dia, String mes, String ano, String cidade, String estado, String[] estilos, String[] integrantes) throws SQLException{
        System.out.println("-------------------- Tah na funçao de inserçao...");

        String comando = "insert into usuario(login, senha, nome, email, data, cidade, estado) values(?,?,?,?,?,?,?)";
        PreparedStatement statement = conexao.prepareStatement(comando);

        statement.setString(1, login);
        statement.setString(2, senha);
        statement.setString(3, nome);
        statement.setString(4, email);
        int x = Integer.parseInt(ano);
        Date data = new Date(x , Integer.parseInt(mes), Integer.parseInt(dia));
        statement.setDate(5, data);
        statement.setString(6, cidade);
        statement.setString(7, estado);

        statement.execute();
        statement.close();

        comando = "insert into usuario_banda(login) values(?)";
        PreparedStatement statement2 = conexao.prepareStatement(comando);

        statement2.setString(1, login);
        

        statement2.execute();
        statement2.close();

        String comandoBusca = "SELECT codigo FROM usuario_banda WHERE login = ?";
        PreparedStatement stmt = conexao.prepareStatement(comandoBusca);

        stmt.setString(1, login);

        ResultSet result = stmt.executeQuery();
        int codigo = 0;
        while(result.next()){
            codigo = result.getInt("codigo");
        }

        comando = "insert into estilos(codigo, login, estilo) values(?,?,?)";

        for(int i = 0;i < estilos.length;i++){
            PreparedStatement statement3 = conexao.prepareStatement(comando);
            statement3.setInt(1, codigo);
            statement3.setString(2, login);
            statement3.setString(3, estilos[i]);
            statement3.execute();
            statement3.close();
        }

        comando = "insert into formacao_banda(codigo, login, componente) values(?,?,?)";

        for(int i = 0;i < integrantes.length;i++){
            PreparedStatement statement4 = conexao.prepareStatement(comando);
            statement4.setInt(1, codigo);
            statement4.setString(2, login);
            statement4.setString(3, integrantes[i]);
            statement4.execute();
            statement4.close();
        }
    }

    public boolean containsLogin(String login){
        Fa f = buscarFa(login);
        if(f == null) return false;
        return true;
    }



    public Fa buscarFaNome (String l){
        String comando = "SELECT     estilos.codigo, estilos.login, estilos.estilo, usuario.codigo AS Expr1, usuario.login AS Expr2, usuario.senha, usuario.nome, usuario.email, usuario.data, usuario.cidade, usuario.estado, usuario_fa.codigo AS Expr3, usuario_fa.login AS Expr4, usuario_fa.genero " +
                "FROM estilos INNER JOIN usuario ON estilos.codigo = usuario.codigo AND estilos.login = usuario.login INNER JOIN usuario_fa ON usuario.codigo = usuario_fa.codigo AND usuario.login = usuario_fa.login " +
                "WHERE usuario.nome = ?";
        Fa fa = null;
        try {
            PreparedStatement statement = conexao.prepareStatement(comando);

            statement.setString(1, l);

            ResultSet result = statement.executeQuery();
            fa = montarFa(result);
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return fa;
    }

     public Fa buscarFa (String l){
        String comando = "SELECT     estilos.codigo, estilos.login, estilos.estilo, usuario.codigo AS Expr1, usuario.login AS Expr2, usuario.senha, usuario.nome, usuario.email, usuario.data, usuario.cidade, usuario.estado, usuario_fa.codigo AS Expr3, usuario_fa.login AS Expr4, usuario_fa.genero " +
                "FROM estilos INNER JOIN usuario ON estilos.codigo = usuario.codigo AND estilos.login = usuario.login INNER JOIN usuario_fa ON usuario.codigo = usuario_fa.codigo AND usuario.login = usuario_fa.login " +
                "WHERE usuario.login = ?";
        Fa fa = null;
        try {
            PreparedStatement statement = conexao.prepareStatement(comando);

            statement.setString(1, l);

            ResultSet result = statement.executeQuery();
            fa = montarFa(result);
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return fa;
    }

     public Banda buscarBandaNome (String l){
        String comando = "SELECT     estilos.codigo, estilos.login, estilos.estilo, usuario.codigo AS Expr1, usuario.login AS Expr2, usuario.senha, usuario.nome, usuario.email, usuario.data, usuario.cidade, usuario.estado, usuario_fa.codigo AS Expr3, usuario_fa.login AS Expr4, usuario_fa.genero " +
                "FROM estilos INNER JOIN usuario ON estilos.codigo = usuario.codigo AND estilos.login = usuario.login INNER JOIN usuario_fa ON usuario.codigo = usuario_banda.codigo AND usuario.login = usuario_banda.login " +
                "WHERE usuario.nome = ?";
        Banda banda = null;
        try {
            PreparedStatement statement = conexao.prepareStatement(comando);

            statement.setString(1, l);

            ResultSet result = statement.executeQuery();
            banda = montarBanda(result);
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return banda;
    }

     public Banda buscarBanda (String l){
        String comando = "SELECT     estilos.codigo, estilos.login, estilos.estilo, usuario.codigo AS Expr1, usuario.login AS Expr2, usuario.senha, usuario.nome, usuario.email, usuario.data, usuario.cidade, usuario.estado, usuario_fa.codigo AS Expr3, usuario_fa.login AS Expr4, usuario_fa.genero " +
                "FROM estilos INNER JOIN usuario ON estilos.codigo = usuario.codigo AND estilos.login = usuario.login INNER JOIN usuario_fa ON usuario.codigo = usuario_fa.codigo AND usuario.login = usuario_fa.login " +
                "WHERE usuario.login = ?";
       Banda banda = null;
        try {
            PreparedStatement statement = conexao.prepareStatement(comando);

            statement.setString(1, l);

            ResultSet result = statement.executeQuery();
            banda = montarBanda(result);
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return banda;
    }

    public Map<String, Fa> getFas(){
        String comando = "SELECT login FROM usuario";
        Map<String, Fa> map = new HashMap<String, Fa>();

        PreparedStatement statement;
        try {
            statement = conexao.prepareStatement(comando);

            ResultSet result = statement.executeQuery();
            Fa fa = montarFa(result);
            
            while(result.next()){
                map.put(result.getString("login"), montarFa(result));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return map;
    }

     public Map<String, Banda> getBandas(){
        String comando = "SELECT login FROM usuario";
        Map<String, Banda> map = new HashMap<String, Banda>();

        PreparedStatement statement;
        try {
            statement = conexao.prepareStatement(comando);

            ResultSet result = statement.executeQuery();
            Banda banda = montarBanda(result);

            while(result.next()){
                map.put(result.getString("login"), montarBanda(result));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return map;
    }

    public Fa montarFa(ResultSet result){
        Fa fa = null;
        try {
            Map estilos = new HashMap();
            while(result.next()){
                estilos.put(result.getString("login"), result.getString("estilo"));
                fa = new Fa(result.getString("login"), result.getString("senha"), result.getString("nome"), result.getString("email"), Integer.toString(result.getDate("data").getDay()), Integer.toString(result.getDate("data").getMonth()), Integer.toString(result.getDate("data").getYear()), result.getString("cidade"), result.getString("estado"), result.getString("genero"), estilos.values().toArray());
                fa.setEstilos(estilos.values().toArray());
            }
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return fa;
    }

     public Banda montarBanda(ResultSet result){
        Banda banda = null;
        try {
            Map estilos = new HashMap();
            Map integrantes = new HashMap();
            while(result.next()){
                estilos.put(result.getString("login"), result.getString("estilo"));
                banda = new Banda(result.getString("login"), result.getString("senha"), result.getString("nome"), result.getString("email"), Integer.toString(result.getDate("data").getDay()), Integer.toString(result.getDate("data").getMonth()), Integer.toString(result.getDate("data").getYear()), result.getString("cidade"), result.getString("estado"),estilos.values().toArray(),integrantes.values().toArray());
                banda.setEstilos(estilos.values().toArray());
                banda.setIntegrantes(integrantes.values().toArray());
            }
        } catch (SQLException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        return banda;
    }
}
